package spese.gestore.androidiani;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

/**
 * La classe Presa_dati si occupa di gestire un'interfaccia nella quale viene
 * richiesto all'utente di inserire i propri dati personali
 * 
 * @author Fusinato Lorenzo - Androidiani
 * 
 */
public class Presa_dati_2 extends Activity {

	// Istanzio i vari editText di cui andrò a servirmi più tardi
	EditText eT_name;
	EditText eT_surname;
	EditText eT_email;
	EditText eT_num_matr;
	ListView lV_presa_dati;
	public String new_user_name;
	public String new_user_surname;
	public String new_user_email;
	public String new_user_matricola;
	public ListViewDb listdb;
	public Cursor curs_list_view;
	public SimpleCursorAdapter adapter;

	protected void onCreate(Bundle b) {
		super.onCreate(b);

		// Setto il layout principale della pagina
		setContentView(R.layout.layout_presa_dati);

		listdb = new ListViewDb(getApplicationContext());
		listdb.open();

		lV_presa_dati = (ListView) findViewById(R.id.lV_presa_dati);

		final Button button_do = (Button) findViewById(R.id.do_req_info);

		// Chiamo il metodo file_to_text che serve a popolare le editText nel
		// caso in cui l'utente abbia già messo i suoi dati
		// in precedenza
		try {
			file_to_text();
		} catch (IOException e1) {
			e1.printStackTrace();
		} // Il catch fa uscire dal try quando non esiste il file dati utente

		curs_list_view = listdb.fetchListViewByActivity("3");

		// Comincio a fare il management del cursore
		startManagingCursor(curs_list_view);
		
		System.out.println("Cursore= "+curs_list_view);

		// Semplice cursor adapter
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, // Contesto
				R.layout.row_presa_dati, // il layout di ogni riga/prodotto
				curs_list_view, // Il cursore
				new String[] {
						ListViewDb.ListViewMetaData.LIST_VIEW_HEADER_KEY,
						ListViewDb.ListViewMetaData.LIST_VIEW_FOOTER_KEY },// questi
																			// colonne
				new int[] { R.id.tV_header_presa, R.id.tV_footer_presa });// in
																		// queste
																		// views

		//stopManagingCursor(curs_list_view);
		
		// Ora la list view si prende questo adapter appena creato sopra
		lV_presa_dati.setAdapter(adapter);

		lV_presa_dati.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				showDialog((int) id);
			}
		});

		// Preparo i vari toast di allerta nel caso i campi editText siamo stati
		// lasciati vuoti
		final Toast toast_no_name = Toast.makeText(this,
				"Campo Nome Obbligatorio", Toast.LENGTH_LONG);

		final Toast toast_no_place = Toast.makeText(this,
				"Campo Cognome Obbligatorio", Toast.LENGTH_LONG);

		final Toast toast_no_sDate = Toast.makeText(this,
				"Campo Email Obbligatorio", Toast.LENGTH_LONG);

		final Toast toast_no_eDate = Toast.makeText(this,
				"Campo Matricola Obbligatorio", Toast.LENGTH_LONG);

		// Preparo un avviso acustico
		final MediaPlayer mpAlert = MediaPlayer.create(this, R.raw.alert);

		// Preparo un avviso tramite vibrazione
		final Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

		// Preparo il listener del bottone
		button_do.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {

				// Ciclo if per controllare che i campi editText non siano vuoti
				if (new_user_name.length() == 0) {
					toast_no_name.show(); // Mostra il toast
					mpAlert.start(); // Fa partire l'alert acustico
					vib.vibrate(300); // Fa partire la vibrazione di 300ms
					return;
				} // Il return fa uscire dall'if e quindi blocca il pulsante

				if (new_user_surname.length() == 0) {
					toast_no_place.show(); // Mostra il toast
					mpAlert.start(); // Fa partire l'alert acustico
					vib.vibrate(300); // Fa partire la vibrazione di 300ms
					return;
				} // Il return fa uscire dall'if e quindi blocca il pulsante

				if (new_user_email.length() == 0) {
					toast_no_sDate.show(); // Mostra il toast
					mpAlert.start(); // Fa partire l'alert acustico
					vib.vibrate(300); // Fa partire la vibrazione di 300ms
					return;
				} // Il return fa uscire dall'if e quindi blocca il pulsante

				if (new_user_matricola.length() == 0) {
					toast_no_eDate.show(); // Mostra il toast
					mpAlert.start(); // Fa partire l'alert acustico
					vib.vibrate(300); // Fa partire la vibrazione di 300ms
					return;
				} // Il return fa uscire dall'if e quindi blocca il pulsante

				try {
					final String TESTSTRING = new String(new_user_name + "\n"
							+ new_user_surname + "\n" + new_user_email + "\n"
							+ new_user_matricola);

					FileOutputStream fOut = openFileOutput("dati_utente.txt",
							MODE_WORLD_READABLE);
					OutputStreamWriter osw = new OutputStreamWriter(fOut);

					// Scrive la stringa sul file
					osw.write(TESTSTRING);

					// Ci assicuriamo che tutti i dati siano scritti sul file e
					// poi lo chiudiamo
					osw.flush();
					osw.close();
				}

				catch (IOException e) {
					e.printStackTrace();
				}

				finally {
				}

				listdb.update("13", "Insert Name", "ex: Guido", "3");
				listdb.update("14", "Insert Surname", "ex: Rossi", "3");
				listdb.update("15", "Insert Email", "ex: guidorossi@gmail.com",
						"3");
				listdb.update("16", "Insert num Matricola", "123456", "3");

				Intent intent = new Intent(Presa_dati_2.this,
						Lista_Missioni.class);
				startActivity(intent);

				System.out.println("Button_do");

			}
		});

	}

	/**
	 * Metodo per riordinare i db quando chiudo l'activity
	 * 
	 * @see android.app.Activity#onDestroy()
	 */
	protected void onDestroy() {
		listdb.close();
	}

	/**
	 * Con questo metodo impongo al device che al tasto "back" faccia quello
	 * voglio io
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK)) {
			listdb.update("13", "Insert Name", "ex: Guido", "3");
			listdb.update("14", "Insert Surname", "ex: Rossi", "3");
			listdb.update("15", "Insert Email", "ex: guidorossi@gmail.com", "3");
			listdb.update("16", "Insert num Matricola", "123456", "3");
			listdb.close();
			Intent intent = new Intent(Presa_dati_2.this, Lista_Missioni.class);
			startActivity(intent);
			return false;
		}
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * Questo metodo di occupa di riempire automaticamente i campi editText nel
	 * caso in cui l'utente abbia già inserito almeno una volta i propri dati
	 * utente. Nel qual caso si ritroverebbe la pagina Presa _dati con i campi
	 * editText già riempiti dai dati immessi precedentemente
	 * 
	 * @return
	 * @throws IOException
	 */
	public boolean file_to_text() throws IOException {

		String one = null;
		String two = null;
		String three = null;
		String four = null;

		try {
			FileReader reader = new FileReader(getFilesDir() + File.separator
					+ "dati_utente.txt");
			System.out.println("filereader");

			Scanner scanner = new Scanner(reader);

			one = scanner.nextLine();
			System.out.println("preso one");

			two = scanner.nextLine();
			System.out.println("preso two");

			three = scanner.nextLine();
			System.out.println("preso three");

			four = scanner.nextLine();
			System.out.println("preso four");

			reader.close();
		}

		catch (FileNotFoundException fnfe) {
			System.out.print("il file dati utente è vuoto");
			return false;
		}

		listdb.update("13", "Insert Name", one, "3");
		listdb.update("14", "Insert Surname", two, "3");
		listdb.update("15", "Insert Email", three, "3");
		listdb.update("16", "Insert num Matricola", four, "3");

		new_user_name = one;
		new_user_surname = two;
		new_user_email = three;
		new_user_matricola = four;

		return true;
	}

	/**
	 * Questo metodo mi permettere di di fare lo switch dei 2 datepicker in base
	 * al pulsante premuto.
	 * 
	 * @see android.app.Activity#onCreateDialog(int)
	 */
	protected Dialog onCreateDialog(int id) {

		switch (id) {
		case 13:
			getName();
			break;
		case 14: 
			getSurname();
			break;
		case 15:
			getEmail();
			break;
		case 16:
			getMatricola();
			break;
		}
		return null;
	}

	private void getName() {
		//Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
		
		//Setto il titolo del mio alert
        miaAlert.setTitle("Insert Name");
        
        final EditText input = new EditText(this); 
        miaAlert.setView(input);

        miaAlert.setCancelable(false);
        
        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
        	
        	  new_user_name=input.getText().toString();
        	  
              listdb.update("13","Insert Name",new_user_name,"3");
              
              curs_list_view.requery();
        	  return;
      	    
          }
        });
            
        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            return;   		
          }
        });
        
        //Ora istanzio il mio alert
        AlertDialog alert = miaAlert.create();
        
        //Ora visualizzo il mio alert appena istanziato
        alert.show();
		
	}

	private void getSurname() {
		//Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
		
		//Setto il titolo del mio alert
        miaAlert.setTitle("Insert Surname");
        
        final EditText input = new EditText(this); 
        miaAlert.setView(input);

        miaAlert.setCancelable(false);
        
        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
        	
        	  new_user_surname=input.getText().toString();
        	  
              listdb.update("14","Insert Surname",new_user_surname,"3");
              
              curs_list_view.requery();
        	  return;
      	    
          }
        });
            
        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            return;   		
          }
        });
        
        //Ora istanzio il mio alert
        AlertDialog alert = miaAlert.create();
        
        //Ora visualizzo il mio alert appena istanziato
        alert.show();
		
	}

	private void getEmail() {
		//Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
		
		//Setto il titolo del mio alert
        miaAlert.setTitle("Insert Email");
        
        final EditText input = new EditText(this); 
        miaAlert.setView(input);

        miaAlert.setCancelable(false);
        
        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
        	
        	  new_user_email=input.getText().toString();
        	  
              listdb.update("15","Insert Email",new_user_email,"3");
              
              curs_list_view.requery();
        	  return;
      	    
          }
        });
            
        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            return;   		
          }
        });
        
        //Ora istanzio il mio alert
        AlertDialog alert = miaAlert.create();
        
        //Ora visualizzo il mio alert appena istanziato
        alert.show();
		
	}

	private void getMatricola() {
		//Creo l'alert Dialog
		AlertDialog.Builder miaAlert = new AlertDialog.Builder(this);
		
		//Setto il titolo del mio alert
        miaAlert.setTitle("Insert Matricola");
        
        final EditText input = new EditText(this); 
        miaAlert.setView(input);

        miaAlert.setCancelable(false);
        
        //Setto l'azione da intraprendere quando viene dato l'ok dall'utente
        miaAlert.setPositiveButton("Save", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
        	
        	  new_user_matricola=input.getText().toString();
        	  
              listdb.update("16","Insert Matricola",new_user_matricola,"3");
              
              curs_list_view.requery();
        	  return;
      	    
          }
        });
            
        //Setto l'azione da intraprendere quando viene dato il "no" dall'utente
        miaAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int id) {
            return;   		
          }
        });
        
        //Ora istanzio il mio alert
        AlertDialog alert = miaAlert.create();
        
        //Ora visualizzo il mio alert appena istanziato
        alert.show();
		
	}

}
